package com.diaohaiwen.framework.mq.rocket.properties;

import lombok.Data;
import org.apache.rocketmq.client.consumer.AllocateMessageQueueStrategy;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.remoting.protocol.heartbeat.MessageModel;

/**
 * @author 刁海文
 * @since 2024/1/16 21:07
 */
@Data
public class ConsumerProperties {
    /**
     * 是否启用
     */
    private boolean enable = true;
    /**
     * 消费组的名称，用于标识一类消费者
     */
    private String consumerGroup;
    /**
     * 消费模式
     */
    private MessageModel messageModel = MessageModel.CLUSTERING;
    /**
     * 启动消费点策略
     */
    private ConsumeFromWhere consumeFromWhere = ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET;
    /**
     * CONSUME_FROM_LAST_OFFSET的时候使用，从哪个时间点开始消费
     */
    private String consumeTimestamp;
    /**
     * 负载均衡策略算法
     */
    private AllocateMessageQueueStrategy allocateMessageQueueStrategy;

    /**
     * 消费线程池的core size
     */
    private int consumeThreadMin = 20;
    /**
     * 消费线程池的max size
     */
    private int consumeThreadMax = Runtime.getRuntime().availableProcessors();
    /**
     * 动态扩线程核数的消费堆积阈值
     */
    private long adjustThreadPoolNumsThreshold = 100000;
    /**
     * 并发消费下，单条consume queue队列允许的最大offset跨度，达到则触发流控
     */
    private int consumeConcurrentlyMaxSpan = 200;
    /**
     * 队列级别的流量控制阈值
     */
    private int pullThresholdForQueue = 100;
    /**
     * 队列级别上限制缓存的消息大小
     */
    private long pullInterval = 0;
    /**
     * 主题级别的流控制阈值
     */
    private int pullThresholdForTopic = -1;
    /**
     * 限制主题级别的缓存消息大小
     */
    private int pullThresholdSizeForTopic = -1;
    /**
     * 每次拉出的信息的最大数量
     */
    private int pullBatchSize = 10;
    /**
     * 消耗请求的流量控制阈值
     */
    private int consumeMessageBatchMaxSize = 1;
    /**
     * 每次拉取的时候是否更新订阅关系
     */
    private boolean postSubscriptionWhenPull = false;
    /**
     * 订阅组的单位
     */
    private boolean unitMode = false;
    /**
     * 一个消息如果消费失败的话，最多重新消费多少次才投递到死信队列
     */
    private int maxReconsumeTimes = -1;
    /**
     * 串行消费使用，如果返回ROLLBACK或者SUSPEND_CURRENT_QUEUE_A_MOMENT，再次消费的时间间隔
     */
    private long suspendCurrentQueueTimeMillis = 1000;
    /**
     * 消费的最长超时时间，单位分钟
     */
    private long consumeTimeout = 15;
    /**
     * 关闭使用者时等待消息的最长时间，0表示无等待。
     */
    private int awaitTerminationMillisWhenShutdown = 0;



}
